
#ifndef _TRAJECTOIRE_H_
#define _TRAJECTOIRE_H_

#include "Terrain.h"


/** @brief File brief description
 Le fichier Trajectoire.h contient la declaration de toutes les fonctions et procedures necessaires
à la gestion de tous les deplacements des protagonistes du jeu (heros, ennemi, boss) mais aussi
des tirs.Ce fichier est donc primordial*/


/** @brief Les points sont la base de toutes les trajectoires, ils sont definis par une position
 * par rapport à l'axe des abscisses et une position par rapport à l'axe des ordonnees (2 reels)*/
typedef struct
{
	float posX_point;
	float posY_point;
} Point;

/** @brief Une trajectoire est definie par un point de depart et un point d'arrivee, une vitesse entre 
 * ces deux points et deux vecteurs de direction*/
typedef struct
{
	Point* ppoint1;
	Point* ppoint2;
	float vitesse1;
	float vectx;
	float vecty;
} Trajectoire;

/** @brief Cette procedure initialise un point en saisissant ses coordonnees en x et en y.
 * @param [in,out] ppoint
 * @param [in] posX
 * @param [in] posY
 */
void initPoint (Point* ppoint, const float posX, const float posY);

/** @brief Cette fonction reserve dans le tas l'espace necessaire pour un point, l'initialise et le retourne
 * @param [in] posX
 * @param [in] posY
 */
Point* creerPoint (const float posX, const float posY);

/** @brief Cette procedure libere l'espace memoire alloue dans le tas pour un point
 * @param [in,out] pppoint
 */
void detruirePoint (Point** pppoint);

/** @brief Cette fonction renvoie la position en x d'un point
 * @param [in] ppoint
 * @return ppoint->posX_point
 */
const float getPosXPoint (const Point* ppoint);

/** @brief Cette procedure permet de changer la position en x d'un point
 * @param [in,out] ppoint
 * @param [in] posX
 */
void setPosXPoint (Point* ppoint, const float posX);

/** @brief Cette fonction renvoie la position en y d'un point
 * @param [in] ppoint
 * @return ppoint->posY_point
 */
const float getPosYPoint (const Point* ppoint);

/** @brief Cette procedure permet de changer la position en y d'un point
 * @param [in,out] ppoint
 * @param [in] posY
 */
void setPosYPoint (Point* ppoint, const float posY);

/** @brief Cette procedure initialise une trajectoire en lui attribuant deux points et une vitesse
 * @param [in,out] ptrajectoire
 * @param [in] ppt1 pointeur sur un premier point
 * @param [in] ppt2 pointeur sur un deuxieme point
 * @param [in] vit1
 */
void initTrajectoire (Trajectoire* ptrajectoire, Point* ppt1, Point* ppt2,
	 const float vit1);

/** @brief Cette fonction reserve dans le tas l'espace necessaire pour une trajectoire, l'initialise et la retourne
 * @param [in] ppt1
 * @param [in] ppt2
 * @param [in] vit1
 */
Trajectoire* creerTrajectoire (Point* ppt1, Point* ppt2, 
	const float vit1);

/** @brief Cette procedure libere l'espace memoire alloue pour les deux points de la trajectoire
 * @param [in,out] ptrajectoire
 */
void libereTrajectoire (Trajectoire* ptrajectoire);

/** @brief Cette procedure libere l'espace memoire alloue dans le tas pour une trajectoire
 * @param [in,out] pptrajectoire
 */
void detruireTrajectoire (Trajectoire** pptrajectoire);

/** @brief Cette fonction renvoie un pointeur sur le premier point qui definit la trajectoire
 * @param [in] ptrajectoire
 * @return ptrajectoire->ppoint1
 */
const Point* getPoint1 (const Trajectoire* ptrajectoire);

/** @brief Cette procedure permet de changer le premier point de la trajectoire
 * @param [in,out] ptrajectoire
 * @param [in] ppoint1
 */
void setPoint1 (Trajectoire* ptrajectoire, const Point* ppoint1);

/** @brief Cette fonction renvoie un pointeur sur le deuxieme point qui definit la trajectoire
 * @param [in] ptrajectoire
 * @return ptrajectoire->ppoint2
 */
const Point* getPoint2 (const Trajectoire* ptrajectoire);

/** @brief Cette procedure permet de changer le deuxieme point de la trajectoire
 * @param [in,out] ptrajectoire
 * @param [in] ppoint2
 */
void setPoint2 (Trajectoire* ptrajectoire,const  Point* ppoint2);

/** @brief Cette fonction renvoie un reel correspondant a la vitesse de la trajectoire
 * @param [in] ptrajectoire
 * @return ptrajectoire->vitesse1
 */
const float getVitesse1 (const Trajectoire* ptrajectoire);

/** @brief Cette procedure permet de changer la vitesse de la trajectoire
 * @param [in,out] ptrajectoire
 * @param [in] vitesse1
 */
void setVitesse1 (Trajectoire* ptrajectoire, const float vitesse1);

#endif
